package utils.binary;

import org.jetbrains.annotations.NotNull;

/**
 * <h1>字节值的可读序列</h1>
 *
 * @author Zhou Yifan
 */
public interface ByteSequence {

    /**
     * 字节序列的大小
     *
     * @return int 值
     */
    int size();

    /**
     * 获取指定位置的字节
     *
     * @param index 指定位置，int 值
     * @return 字节， byte 值
     */
    byte byteAt(int index);

    /**
     * 比较当前字节数组与指定的字节数组是否相等
     *
     * @param data 指定字节数组
     * @return 布尔值
     */
    default boolean equalBytes(byte @NotNull [] data) {
        if (data.length != size()) {
            return false;
        }
        for (int i = 0; i < data.length; i++) {
            if (data[i] != byteAt(i)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 获取字节序列的子序列
     *
     * @param start 开始位置，int 值，包含
     * @param end   结束位置，int 值，不包含
     * @return 字节序列 {@link ByteSequence}
     */
    ByteSequence subSequence(int start, int end);

    /**
     * 从指定位置开始，将当前字节序列复制到目标字节数组的指定位置
     *
     * @param srcOffset  当前字节数组开始复制的位置
     * @param target       目标字节序列
     * @param targetOffset 目标字节数组开始位置
     * @param length     复制长度
     * @return int 值，表示复制的字节长度
     */
    int copyTo(int srcOffset, byte[] target, int targetOffset, int length);

    /**
     * 从 0 位置开始，将当前字节序列复制到目标字节数组的指定位置
     *
     * @param target       目标字节序列
     * @param targetOffset 目标字节数组开始位置
     * @param length     复制长度
     * @return int 值，表示复制的字节长度
     */
    default int copyTo(byte[] target, int targetOffset, int length) {
        return copyTo(0, target, targetOffset, length);
    }

}
